// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了
// 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了 谁让你打开看了

// 看吧看吧，给你看
import fs from 'fs';
import fetch from 'node-fetch';
import path from 'path';
import common from '../../lib/common/common.js';

const dataPath = path.join(path.resolve(), 'data', '优美图集')
const userDataPath = path.join(dataPath, '免费GPT KEY合集.json')
if (!fs.existsSync(dataPath)) {
    fs.mkdirSync(dataPath, { recursive: true })
    fs.writeFileSync(userDataPath, JSON.stringify({
        publicKey: ""
    }, null, 4))
}
if (!fs.existsSync(userDataPath)) {
    fs.writeFileSync(userDataPath, JSON.stringify({
        publicKey: ""
    }, null, 4))
}

export class example extends plugin {
    constructor() {
        super({
            name: '[Sky]身高查询',
            dsc: '光遇身高查询，用户自填Key查询',
            event: 'message',
            priority: -1,
            rule: [
                { reg: /^[#\/]?(身高查询|查询身高)$/, fnc: 'skyHeightInquiry' },
                { reg: /^[#\/]?绑定(sid|fc|key)(.*)/, fnc: 'binding' },
                { reg: /^[#\/]?设置公共key(.*)/i, fnc: 'setPublicKey' }
            ]
        })
    }

    async skyHeightInquiry(e) {
        const userData = await getUserData()
        const ID = e.user_id
        const { publicKey } = userData

        if (!userData[ID]) {
            userData[ID] = {}
        }

        if (!userData[ID]['Key'] && publicKey === '') {// 不存在用户Key & 无公共Key
            return e.reply(['未绑定Key，请注册账号获得Key\r使用指令[绑定key+你的key]来绑定\r请前往https://api.t1qq.com注册'], true)
        }

        let Key = ''
        if (userData[ID]['Key']) {// 存在用户Key
            Key = userData[ID]['Key']
        } else if (!userData[ID]['Key'] && publicKey !== '') {// 不存在用户Key & 存在公共Key
            Key = publicKey
        }

        if (!userData[ID]['Sky ID']) {
            return e.reply(['未绑定光遇ID\r使用指令[绑定sid+你的光遇长ID]来绑定'], true)
        }

        if (!userData[ID]['friendCode']) {
            return e.reply(['未填写好友码\r使用指令[绑定fc+你的好友邀请码]来绑定\r注: [一号一码，若换号请重新填写好友码，请不要拉黑身高检测员，以便后续重复查询]'], true)
        }

        const HeightData = await getHeightData(Key, userData[ID]['Sky ID'], userData[ID]['friendCode'])
        const { code } = HeightData

        const errorMessages = {
            0: ['接口请求失败\r过段时间再来查询吧'],
            201: ['请绑定正确的光遇ID\r使用指令[绑定sid+你的光遇长ID]来绑定'],
            202: ['未填写好友邀请码或已失效\r使用指令[绑定fc+你的好友邀请码]来绑定\r注: [一号一码，若换号请重新填写好友码]'],
            400: ['Key余额不足\r请充值'],
            403: ['Key错误\r获取数据失败'],
            405: ['服务器繁忙\r请稍后再试'],
            406: ['ID与邀请码不匹配\r请输入同ID下的同邀请码'],
            500: ['查询失败\r服务器错误']
        };

        if (errorMessages[code]) {
            return e.reply(errorMessages[code], true);
        }

        const {
            data, // 身高数据
            score, // 评分数据
            adorn, // 装扮数据
            action // 动作数据
        } = HeightData
        const {
            scale, // 体型值, 即[胖瘦]
            height, // 身高值, 即[高矮]
            currentHeight, // 当前身高
            maxHeight, // 最高身高
            minHeight // 最矮身高
        } = data
        const {
            scaleScore, // 体型评分
            heightScore, // 身高评分
            currentHeightScore, // 当前身高评分
            maxHeightScore, // 最高身高评分
            minHeightScore // 最矮身高评分
        } = score
        const {
            cloak, // 斗篷
            prop, // 背饰
            neck, // 项链
            mask, // 面具
            horn, // 头饰
            hair, // 发型
            pants // 裤子
        } = adorn
        const {
            voice, // 叫声
            attitude // 站姿
        } = action

        const msg = [
            await common.makeForwardMsg(e, [
                '身高数据⬇️',
                `体型值(胖瘦): ${scale}\r身高值(高矮): ${height}\r当前身高: ${currentHeight}\r最高身高: ${maxHeight}\r最矮身高: ${minHeight}`,
                '身高评分⬇️',
                `体型值: ${scaleScore}\r身高值: ${heightScore}\r当前身高: ${currentHeightScore}\r最高身高: ${maxHeightScore}\r最矮身高: ${minHeightScore}`
            ], '身高数据&评分😎'),
            await common.makeForwardMsg(e, [
                '装扮数据⬇️',
                `斗篷: [${cloak}]\r背饰: [${prop}]\r项链: [${neck}]\r面具: [${mask}]\r头饰: [${horn}]\r发型: [${hair}]\r裤子: [${pants}]`
            ], '装扮数据😘'),
            await common.makeForwardMsg(e, [
                '动作数据⬇️',
                `叫声: ${voice}\r站姿: ${attitude}`
            ], '动作数据🤩')
        ]

        return e.reply(await common.makeForwardMsg(e, msg, '请查询你的身高数据'))
    }

    async binding(e) {
        const userData = await getUserData()
        const ID = e.user_id

        const [, type, content] = e.msg.match(/^[#\/]?绑定(sid|fc|key)(.*)/)

        if (!userData[ID]) userData[ID] = {}

        if (type === 'sid') {
            userData[ID]['Sky ID'] = content
        } else if (type === 'fc') {
            userData[ID]['friendCode'] = content
        } else if (type === 'key') {
            const linkData = await (await fetch(`https://api.t1qq.com/api/tool/yhtj?key=${content}`)).json()
            if (linkData[0]['code'] !== 200) { // 验证Key是否可用
                return e.reply('该Key不可用，无法绑定')
            }

            userData[ID]['Key'] = content
        }

        storeUserData(userData)
        return e.reply(['绑定成功，记得及时撤回'])
    }

    async setPublicKey(e) {
        if (!e.isMaster) {
            return e.reply(['你凑什么热闹'])
        }
        const userData = await getUserData()
        const [, content] = e.msg.match(/^[#\/]?设置公共key(.*)/i)
        userData['publicKey'] = content

        storeUserData(userData)
        return e.reply(['设置成功'])
    }
}

async function getUserData() {
    return await JSON.parse(fs.readFileSync(userDataPath), 'utf8')
}

async function getHeightData(key, ID, friendCode) {
    try {
        return await (await fetch(`https://api.t1qq.com/api/sky/sc/sg?key=${key}&cx=${ID}&code=${friendCode}`)).json()
    } catch (error) {
        return { code: 0, error }
    }
}

function storeUserData(data) {
    fs.writeFileSync(userDataPath, JSON.stringify(data, null, 4));
}